年一回 TypeScript と Node.js のモジュール関係で苦しむ
Summary
これは嘘で, 成立はしていない (マジ)
最低限, module と moduleResolution のペアややってはいけないことは覚えておいて損はない…はず
e.g.)
moduleResolution で node と classic は指定してはいけない
"module": "node(16|next)" と "moduleResolution": "node(16|next)" は必ずペア
"module": "esnext" と "moduleResolution": "bundler" は必ずペア
おそらく, "module": "es2022" も同様?
"module": "esnext" は Node.js アプリケーションでは使用しない
などなど
所感として, 後方互換性を思いっきり無視して古い仕様をバサッと切れれば問題ないんだろうけど, Node.js アプリケーション特有の大量のライブラリ依存と同時に言語自体や Web 関連の進歩 (新たな仕様策定等) が足枷となって非常に複雑な問題となってしまいどうしようもなくなったという感じを得た.
実際には, その時々でその場で対応してたものが色々積み重なったという結果なので, ターニングポイントがどこかというのも判別できない気がする…
と同時に, レイヤーが特定アプリケーション, つまりは Node.js (と ECMAScript) という枠組みの中で TypeScript は完結しているため, TypeScript という言語仕様だけの問題とは言いづらい これは, TypeScript のコンパイル/トランスパイル先となるエコシステムの問題があるということです
Environments
Node.js: v18.18.2
TypeScript: v5.2.2
Introduction
あとで書く (書きたい)
References
TypeScript: Documentation - Modules - Reference
TypeScriptのmoduleオプションの話、あるいはTypeScript開発者の苦悩、あるいはCJSとESMの話
TypeScript で"moduleResolution": "Node"は使わないほうがいい